今天將建立財務記錄的資料模型,並實現相應的 CRUD (Create, Read, Update, Delete) 功能,讓用戶能夠新增、檢視、修改和刪除財務紀錄,這是個人財務管理應用的核心功能之一。
財務記錄將使用 Transaction 模型來儲存。每筆交易將包含交易類型(收入或支出)、金額、描述和日期等基本訊息。
在 models/ 文件夾中創建 Transaction.js:
js
const mongoose = require('mongoose');
const transactionSchema = new mongoose.Schema({
user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
type: { type: String, enum: ['income', 'expense'], required: true },
amount: { type: Number, required: true },
description: { type: String, required: true },
date: { type: Date, default: Date.now },
});
module.exports = mongoose.model('Transaction', transactionSchema);
接著要實現新增財務記錄的功能,允許用戶添加收入或支出的交易。
在 routes/ 文件夾中創建 transactions.js,設置一個 POST 請求來處理新增交易的操作:
js
const express = require('express');
const auth = require('../middleware/authMiddleware');
const Transaction = require('../models/Transaction');
const router = express.Router();
// 新增交易
router.post('/', auth, async (req, res) => {
const { type, amount, description } = req.body;
try {
const transaction = new Transaction({
user: req.user,
type,
amount,
description,
});
await transaction.save();
res.status(201).json(transaction);
} catch (error) {
res.status(500).json({ msg: 'Server error' });
}
});
module.exports = router;
用戶需要傳送 type、amount 和 description 來新增一筆交易,並且這個操作受 JWT 保護,必須通過身份驗證。
為了讓用戶檢視他們的財務紀錄,需要提供一個 GET 請求來獲取屬於用戶的所有交易。
在 transactions.js 中繼續實現查詢交易功能:
js
// 查詢用戶的所有交易
router.get('/', auth, async (req, res) => {
try {
const transactions = await Transaction.find({ user: req.user }).sort({ date: -1 });
res.json(transactions);
} catch (error) {
res.status(500).json({ msg: 'Server error' });
}
});
這段程式碼會根據當前用戶的 ID 查詢他們的所有交易,並按照日期降序排列。
用戶可能需要修改已經存在的交易,例如更新金額或描述。所以要做一個 PUT 請求來修改指定的交易。
在 transactions.js 中添加更新程式碼:
js
// 更新交易
router.put('/:id', auth, async (req, res) => {
const { type, amount, description } = req.body;
try {
let transaction = await Transaction.findById(req.params.id);
if (!transaction) {
return res.status(404).json({ msg: 'Transaction not found' });
}
// 確認該交易屬於當前用戶
if (transaction.user.toString() !== req.user) {
return res.status(401).json({ msg: 'Not authorized' });
}
// 更新交易訊息
transaction = await Transaction.findByIdAndUpdate(
req.params.id,
{ type, amount, description },
{ new: true }
);
res.json(transaction);
} catch (error) {
res.status(500).json({ msg: 'Server error' });
}
});
在這邊要注意查詢要修改的交易是否存在,並確保該交易屬於當前用戶,然後進行更新。
當用戶想要刪除一筆交易時,需要提供一個 DELETE 請求來刪除指定交易。
在 transactions.js 中加入刪除功能:
js
// 刪除交易
router.delete('/:id', auth, async (req, res) => {
try {
const transaction = await Transaction.findById(req.params.id);
if (!transaction) {
return res.status(404).json({ msg: 'Transaction not found' });
}
// 確認該交易屬於當前用戶
if (transaction.user.toString() !== req.user) {
return res.status(401).json({ msg: 'Not authorized' });
}
await transaction.remove();
res.json({ msg: 'Transaction removed' });
} catch (error) {
res.status(500).json({ msg: 'Server error' });
}
});
這個操作會查詢指定交易並確認該交易屬於當前用戶,然後將其從資料庫中移除。
在 server.js 中整合交易路由:
js
const transactionRoutes = require('./routes/transactions');
app.use('/api/transactions', transactionRoutes);
使用 Postman 或其他 API 測試工具來測試 CRUD 功能:
今天設置了財務記錄的資料模型並實現了 CRUD 操作,包括新增、查詢、更新和刪除財務交易。這些功能讓應用能夠管理用戶的收入和支出記錄,實現了個人財務管理應用的核心功能。之後將進一步優化這些功能,加入更多的應用功能。